class Biology {
}
class Animal extends Biology {
}
class Dog extends Animal {
}
class Cat extends Animal {
}


class Message<T> { // 设置泛型
    private T message ;
    public T getMessage() {//获取
        return message;
    }
    public void setMessage(T message) {//设置
        this.message = message;
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Message<Animal> message = new Message<>() ;
        message.setMessage(new Animal());
        fun(message);

        Message<Biology> message2 = new Message<>() ;
        message2.setMessage(new Biology());
        fun(message2);
    }

    public static void fun(Message<? super Animal> message){//只接受Animal或者它的父类
        System.out.println(message.getMessage());

        message.setMessage(new Dog());//此时可以修改(传入数据)，因为Dog、Cat对象都是Animal的子类
        message.setMessage(new Cat());

        Animal animal = (Animal)message.getMessage();//这里是不知道返回什么类型的值的，所以只能这样转型，但这样是不安全的
                                                     //so:只可以直接打印
    }
}